/**
 * Copyright(c) 2013 Jade Techonologies, Ltd.
 *
 * History:
 *   2011-5-25 14:46:21 Created by sky
 */
package com.jade.bss.base.customer;

import com.jade.bss.base.customer.info.EnterpriseInfo;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 客户管理接口，包括新增客户、删除客户以及修改客户信息等等。
 *
 * @author sky
 * @version 1.0 2011-5-25 14:46:21
 */
public interface EnterpriseManager
{
    /**
     * 添加一个客户
     *
     * @param customer 客户对象
     * @return 客户标识
     * @throws CustomerException 客户名称冲突
     */
    public long add(EnterpriseInfo enterpriseInfo)
            throws CustomerException;

    /**
     * 根据客户标识获取客户信息
     * <p/>
     * 如果客户不存在，返回null
     *
     * @param id 客户标识
     * @return 客户对象
     */
    public EnterpriseInfo get(long id);

    /**
     * 修改客户基本资料信息，仅仅包括名称、手机、邮件地址等信息。
     *
     * @param customer 客户资料
     * @throws CustomerException 客户名称冲突
     */
    public void update(EnterpriseInfo customer)
            throws CustomerException;

    /**
     * 查询客户的信息,获取客户列表。infoClasses表示要获取的扩展信息类，为null或者空将不获取扩展信息类型。
     * Criteria条件中各个项的名称必须为 customer.name 或者 latestLoginInfo.name 这种格式。
     *
     * @param criteria    参数
     * @param infoClasses 扩展信息类
     * @return 客户列表
     */
    public PagingList<EnterpriseInfo> query(Criteria criteria);


    /**
     * 批量删除客户
     *
     * @param ids 客户标识数组
     * @throws CustomerException 异常
     */
    public void remove(long... ids)
            throws CustomerException;

}
